`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 11/17/2021 08:37:24 PM
// Design Name: 
// Module Name: main_function_module
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module main_function_module(
    input rst_n,
    input rst,
    input en,
    input clk,
    input key,
    input [3:0] LD0,
    input [3:0] LD1,
    input [3:0] LD2,
    input [3:0] work0,
    input [3:0] work1,
    input [3:0] rest0,
    input [3:0] rest1,
    output [3:0] out0,
    output [3:0] out1,
    output [3:0] out2,
    output [3:0] out3,
    output [7:0] led,
    output en_cnt
    );

    wire clk0,clk1,cout1,cout2,cout3,key_value,en_cal,cout,rst4,key_p_flag,key_n_flag,key_last,key_final,myrst_n;
    timer timer_inst(
        .clk(clk),
        .rst(rst_n),
        .en(en_cal),
        .out(clk0)
    );
    eliminator elimin_inst(
        .rst_n(rst_n),
        .clk(clk),
        .key(key),
        .key_value(key_value),
        .key_p_flag(key_p_flag),
        .key_n_flag(key_n_flag)
    );
    key_last_control last_inst(
        .clk(clk),
        .rst_n(rst_n),
        .key_p_flag(key_p_flag),
        .key_n_flag(key_n_flag),
        .last(key_last),
        .key_value(key_final)
    );
    mainControl control(
        .clk(clk),
        .rst(rst),
        .myen(en),
        .key_start_stop(key_final),
        .key_last(key_last),
        .over(cout),
        .work0(work0),
        .work1(work1),
        .rest0(rest0), 
        .rest1(rest1),
        .LD0(LD0),
        .LD1(LD1),
        .LD2(LD2),
        .en(en_cal),
        .rst_n(myrst_n),
        .en_cnt(en_cnt)
    );
    lighter light_inst(
        .clk(clk),
        .rst(key_p_flag),
        .en(cout),
        .led(led)
    );
    subtractor10 sub10_inst1(
        .rst(myrst_n),
        .cp(clk0),
        .clk(clk),
        .LD(LD0),
        .out(out0),
        .cout(cout1)
    ); // 秒最后一位
    subtractor6 sub6_inst(
        .rst(myrst_n),
        .cp(cout1),
        .clk(clk),
        .out(out1),
        .cout(cout2)
    ); // 秒前一位
    subtractor10 sub10_inst2(
        .rst(myrst_n),
        .cp(cout2),
        .clk(clk),
        .LD(LD1),
        .out(out2),
        .cout(cout3)
    ); // 分最后一位  

    subtractor10 sub10_inst3(
        .rst(myrst_n),
        .cp(cout3),
        .clk(clk),
        .LD(LD2),
        .out(out3),
        .cout(cout)
    ); // 分前一位 
    
endmodule
